cssmatcher: Rewrite nth-child matcher
authorBenjamin Otte <otte@redhat.com>
Thu, 28 May 2015 15:12:57 +0000 (17:12 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 28 May 2015 15:12:57 +0000 (17:12 +0200)
Instead of trying to be smart, be stupid but correct.

Fixes nth-child reftest.

gtk/gtkcssmatcher.c

index c68f650915a96c57acb2a67e18357e222f0be9cf..14597ccf1b94b82bfb38461a84855243d0cd2b55 100644 (file)
@@ -356,27 +356,23 @@ gtk_css_matcher_node_nth_child (GtkCssNode *node,
                                 int         a,
                                 int         b)
 {
-  while (b-- > 0)
-    {
-      if (node == NULL)
-        return FALSE;
+  int pos, x;
 
-      node = prev_node_func (node);
-    }
+  /* count nodes */
+  for (pos = 0; node != NULL; pos++)
+    node = prev_node_func (node);
+
+  /* solve pos = a * X + b
+   * and return TRUE if X is integer >= 0 */
+  x = pos - b;
 
   if (a == 0)
-    return node == NULL;
-  else if (a == 1)
-    return TRUE;
+    return x == 0;
 
-  b = 0;
-  while (node)
-    {
-      b++;
-      node = prev_node_func (node);
-    }
+  if (x % a)
+    return FALSE;
 
-  return b % a == 0;
+  return x / a > 0;
 }
 
 static gboolean